package mutation_selection;

import java.util.Random;

public class MutationSelectionExampleGrams {
	
	private double besteWert;
	private double neueWert;
	private double zielWert;

	private Random r;
	private int maxRunden;
	
	public MutationSelectionExampleGrams (double zielWert, int maxRunden)
	{
		this.maxRunden = maxRunden;
		this.zielWert = zielWert;
		
		r = new Random(); //Startwert 
		besteWert = r.nextGaussian() % 1.0;
	}
	
	/**
	 * berechnet Abstand zwischen zielWert und wert
	 **/
	public double eval(double wert)
	{
		return Math.abs(zielWert - wert);
	}
	
	public void optimieren()
	{
		
		double sigma = 0.01;
		double sigmaMin = 0.5;
		double fitnessNeu, fitnessAlt;
		int aufwand = 0;
		fitnessAlt = eval(besteWert);
		do{
		
			for(int i = 0; i < maxRunden; i++)
			{
				
				neueWert = (r.nextGaussian() * sigma) + besteWert; /* sein drawing(A,s) ist eine blackbox*/
				fitnessNeu = eval(neueWert);
				// Selektion
				if(fitnessAlt > fitnessNeu)	{
					System.out.println(besteWert + "\t\t" + neueWert);
					besteWert = neueWert;
					fitnessAlt = fitnessNeu;
					sigma *= 2.0;
					i = 0;
				}
				aufwand++;
			}
			
			sigma /= 2;
			System.out.println("Sigma " + sigma);
			aufwand++;
		}while(sigma > sigmaMin);
		
		
		System.out.println("*ENDE*");
		System.out.println("Ergebnis: " + besteWert);
		System.out.println("Fitness: " + fitnessAlt);
		System.out.println("Aufwand: " + aufwand);
	}
	
	public static void main(String[] args) {
		MutationSelectionExampleGrams m = new MutationSelectionExampleGrams(0, 100);
		m.optimieren();
		
	}
}
